#include <stdio.h>

#define DENOM_MAX 10000

/* 
ENUNCIADO
 
12.  Faça um programa que calcula a soma:
 
      1     1     1            1       1
 1 - --- + --- - --- + ... + ----- - ----- 
      2     3     4           9999   10000

pelas seguintes maneiras:

    * adição dos termos da direita para a esquerda;
    * adição dos termos da esquerda para a direita;
    * adição separada dos termos positivos e dos
        termos negativos da esquerda para a direita;
    * adição separada dos termos positivos e dos
        termos negativos da direita para a esquerda.

Compare e discuta os resultados obtidos no computador.


DISCUSSÃO

Resultados com diferentes tipos de real

float:
total_esq_dir    : 0.693 0916 905403 137 20703125000000
total_esq_dir_sep: 0.693 1018 829345 703 12500000000000
total_dir_esq    : 0.693 0971#741676 330 56640625000000
total_dir_esq_sep: 0.693 0975 914001 464 84375000000000

double:
total_esq_dir    : 0.693 0971 830599 582 66149180872162
total_esq_dir_sep: 0.693 0971 830599 537 14234779909020
total_dir_esq    : 0.693 0971 830599 452#76539792757831
total_dir_esq_sep: 0.693 0971 830599 483 85164261708269

long double:
total_esq_dir    : 0.693 0971 830599 452 95947011645321
total_esq_dir_sep: 0.693 0971 830599 452 84779729268720
total_dir_esq    : 0.693 0971 830599 452 96922793600558
total_dir_esq_sep: 0.693 0971 830599 452 97790155338546

Conclusão: o resultado mais preciso é obtido somando os
termos da direita para a esquerda, ou seja, no
sentido 1/10000, 1/9999 ... 1/2, 1/1.
 
*/

typedef float real;

int main() {

    real termos[DENOM_MAX];
    real total_esq_dir, total_dir_esq;
    real total_esq_dir_sep, total_dir_esq_sep;
    real total_pos, total_neg; 
    int i;
    int sinal;
    for (i=0;i<DENOM_MAX;i++) {
        sinal = (i%2) ? -1 : 1;
        termos[i] = sinal/(real)(i+1);
    }
    total_esq_dir = total_dir_esq = 0.0;
    for (i=0;i<DENOM_MAX;i++) {
        total_esq_dir += termos[i];
        total_dir_esq += termos[(DENOM_MAX-1)-i];
    }
    total_pos = total_neg = 0.0;
    for (i=0;i<DENOM_MAX;i+=2) {
        total_pos += termos[i];
        total_neg += termos[i+1];
    }
    total_esq_dir_sep = total_pos + total_neg;
    total_pos = total_neg = 0.0;
    for (i=DENOM_MAX-1;i>=0;i-=2) {
        total_neg += termos[i];
        total_pos += termos[i-1];
    }
    total_dir_esq_sep = total_pos + total_neg;
    printf("total_esq_dir    : %.30Lf\n", (long double)total_esq_dir);
    printf("total_esq_dir_sep: %.30Lf\n", (long double)total_esq_dir_sep);
    printf("total_dir_esq    : %.30Lf\n", (long double)total_dir_esq);
    printf("total_dir_esq_sep: %.30Lf\n", (long double)total_dir_esq_sep);
    return 0;
}
